home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 4 / The Arsenal Files 4 (Arsenal Computer).ISO / tbbs / sdl-prim.txt < prev    next >
Text File  |  1995-04-24  |  43KB  |  951 lines

  1. [NOTE: This is the text file taken from issues of _Possibilities_. It is quite
  2. old and there have been many additions to the System Definition Language (SDL).
  3. Please note that any page number references are probably no longer valid. Also I
  4. left in the old-fashioned"typewriter-style" 2-space punctuation.
  5.  
  6. That being stated, it is an excellent introduction to SDL. SDL is probably
  7. easier to learn and use than a main BBS .BATch file and infinitely faster than
  8. MEDIT.
  9.  
  10. One of the things that you might try: after using this introduction, you may
  11. well find that using numerous MENUXXXX.SDL files much faster and more convenient
  12. than using a single one. Using a text editor, such as Q-Edit, will - with the
  13. addition of DOSKEY (included with DOS v5 and later) - make editing and
  14. compiling .SDLfiles smooth and close to effortless.
  15.  
  16. Enjoy!!    Gray Shockley / Board on Boards BBS / postmaster@compcomm.com ]
  17.  
  18. -----------------------------------------------------------------------------------------
  19.  
  20.                               An SDL Primer
  21.  
  22.                              by Alan Bechtold
  23.                 Copyright 1990 by eSoft, Incorporated.
  24.                             All Rights Reserved
  25. -----------------------------------------------------------------------------------------
  26. Note:  The following four part series on using SDL is reprinted with
  27. permission from the eSoft possibilities newsletter.
  28.  
  29. Possibilities is a monthly customer support publication of:
  30.  
  31.      eSoft, Incorporated
  32.      15200 E. Girard Avenue
  33.      Suite 2550
  34.      Aurora, Co 80014
  35.  
  36. This series of articles may not be reproduced in any form except by inclusion
  37. of the above copyright notice.  This file is authorized for distribution
  38. without charge only if it is unchanged in any way.  Any use of this information in any
  39. other way must include proper credit to its source.
  40.  
  41. Part 1: Getting started with SDL 
  42.  
  43. The idea of a "computer language" conjures up images of all-night sessions in 
  44. front of a terminal -- struggling to master a complex new way to talk to your 
  45. computer.  SDL -- the TBBS System Definition Language Compiler -- isn't that 
  46. way at all.
  47.  
  48. SDL is just a different way to design and maintain all of your TBBS system's 
  49. menus.  SDL's approach to TBBS menu construction and maintenance is easy 
  50. to learn.  With SDL, you use your favorite word processor or text editor to 
  51. write out all of your TBBS menus in an ASCII text file.  It's like writing a 
  52. letter, but you have to learn to write it in terms that the SDL compiler will 
  53. understand, so it can follow your instructions and build the TBBS menus you 
  54. want.
  55.  
  56. The first step is to understand how the SDL compiler works. The SDL 
  57. compiler reads your SDL source file (the ASCII text file I mentioned above) 
  58. and, like a duti- ful French chef, follows your commands, creating TBBS 
  59. menus exactly as you've specified.
  60.  
  61. Because you may already have menus you built with MEDIT, the SDL 
  62. decompiler is also provided.  The SDL decompiler takes TBBS menus that 
  63. already exist on your system and creates an SDL source file for your system.  
  64. This allows you to start using SDL whenever you're ready.  You can start with 
  65. the MEDIT menus you've got now, without worrying about re-doing 
  66. anything you've already done on your system.
  67.  
  68. Since most TBBS system designers start with MEDIT and already have at least 
  69. a few TBBS menus they're using on their systems, let's start by getting 
  70. familiar with the SDL decompiler.
  71.  
  72. Pick one of your menu files -- a simple one would be best to start with -- and 
  73. we'll decompile it together.  Since I don't have any way to know which 
  74. existing menu you've selected to decompile I'll use your top level menu -- 
  75. MENU0000.CTL --  in the following examples. 
  76.  
  77. Make sure the program SDLDC.COM is in the same subdirectory as the menu 
  78. file, then type:
  79.  
  80.      SDLDC SAMPLE /M:0000
  81.  
  82. The "/M:0000" on the the end of the above command is an option that tells
  83.  
  84. SDLDC to decompile only the single menu file named after the "/M:".
  85.  
  86. Typing the above command will decompile the menu file MENU0000.CTL, 
  87. and create an ASCII text file named SAMPLE.SDL.  This is the SDL source file 
  88. that is your menu written in SDL format.  You can look at it with any word 
  89. processor or text editor.
  90.  
  91. In fact, go ahead -- use your word processor to look at SAMPLE.SDL.  Then 
  92. look at the your MENU0000.CTL file with MEDIT (the original menu file 
  93. itself isn't changed or destroyed by SDLDC.COM).  You'll definitely gain some 
  94. insight into the way SDL works.
  95.  
  96. For example, the ASCII text SDL source file for a simple menu to read 
  97. messages on your system might look like this:
  98.  
  99.      Menu:0000
  100.      Billing:7
  101.      Title:
  102.      READ TBBS MESSAGES
  103.      ------------------
  104.      EndTitle:
  105.      Entry:
  106.      <R>ead Messages
  107.      A1=--X-----
  108.      Key=R Type=6 Opt Data=Bulletin Board
  109.              . . .
  110.      EndMenu:
  111.  
  112. The first line in the above example -- Menu: 0000 -- tells the SDL compiler 
  113. that all text that follows, until the line reading EndMenu: is reached contains 
  114. the specifications for a single TBBS menu named 0000.
  115.  
  116.  
  117. Billing:7, the next line, indicates that the above menu will accrue time
  118. against the user's account in  Billing Class 7, as specified in ULEDIT by
  119. the TBBS system designer.  If this line is absent, the menu is assigned to
  120. Billing Class 0 by default.
  121.  
  122. Next comes the line that reads Title:.  This command -- like the Menu: and
  123. EndMenu: commands -- tells the SDL compiler that the text which follows --
  124. until the line that reads EndTitle: is reached -- will be displayed as the
  125. title of the specified menu.
  126.  
  127. The Entry: command specifies the various options offered to the user on this
  128. particular menu.  The specifications that follow the Entry: command ("A1="
  129. "Key=" "Type=6" and "Opt Data=Bulletin Board"), indicate the A1 flags that
  130. must be set for the user to access this specific menu option, the key that will
  131. activate the option, the option's TBBS Type (in this case, the Receive
  132. Messages option), and the Opt Data that must be specified for that menu
  133. option.  These serve the same functions as their counterparts in MEDIT.
  134.  
  135. You should see by now that the text in an SDL source file is very much like 
  136. the layout of a menu when you look at it with MEDIT.  That's because SDL 
  137. was designed to extend and broaden MEDIT, to replace it totally.
  138.  
  139. If you wish, you can also decompile all the menus on your TBBS system into 
  140. a single  ASCII SDL source file.  To do this, just type:
  141.  
  142.      SDLDC SAMPLE
  143.  
  144. If you leave OFF the optional /M: argument that was included in our first 
  145. step, SDLDC will decompile every menu in your system into the single source 
  146. file you've named.  This file will contain all of your TBBS system's menus, in 
  147. easy-to-modify ASCII text, and will afford you a complete overview of your
  148. system at all times.
  149.  
  150. It also allows you to use all the powerful features your favorite word 
  151. processor or text editor has to offer modifying and updating your system's 
  152. menus.  Control codes can also be entered in SDL source files, so you can 
  153. build menus incorporating ANSI or IBM graphics.
  154.  
  155. Now it's time to compile the menu(s) we just decompiled.  Make sure the 
  156. program SDL.COM is in the same subdirectory as SAMPLE.SDL.  Then, type:
  157.  
  158.      SDL SAMPLE
  159.  
  160. and the SDL compiler will compile the ASCII text file, SAMPLE.SDL, that was 
  161. created when you decompiled the menu(s) from your own system, back into 
  162. .CTL file form.  This new .CTL file would include any changes we made to the 
  163. source file with your text editor -- if we had made any.
  164.  
  165. Because you can define all of your system's menus in a single ASCII .SDL text 
  166. file, you can also instruct SDL to compile only a single menu from an .SDL 
  167. file.  You do this by following the above command with a slash, "M:" and the 
  168. name of the single menu you want compiled.  In our example, you'd type:
  169.  
  170.      SDL SAMPLE /M:0000
  171.  
  172. to instruct the SDL compiler to compile only the MENU0000.CTL menu file
  173. from SAMPLE.SDL, even if it contained source code for all of your system's
  174. menus. This option allows you to keep your entire system's menu definitions
  175. in a single source file, but still makes it easy to make changes to individual
  176. menus.
  177.  
  178. To see how SDL works with your entire system, type the following:
  179.  
  180.      SDLDC SAMPLE
  181.  
  182. This will make SDLDC decompile ALL the menus on your TBBS system into 
  183. a single SDL source file, named SAMPLE.SDL.  When the compiler's through, 
  184. load up your favorite word processor again and take a look at SAMPLE.SDL.  
  185. This time you'll see every menu in your TBBS system, written out in SDL 
  186. source code, ready to modify, change, or compile again.
  187.  
  188. Now, let's compile only the menu from your system that we decompiled as 
  189. our first step in this tutorial.  To do this, type:
  190.  
  191.      SDL SAMPLE /M:0000
  192.  
  193. You will see that SDL only compiles and replaces MENU0000.CTL even 
  194. though the SAMPLE.SDL file contains all of the menus in your system.
  195.  
  196. There are two more options you can use when you run the SDL compiler: 
  197. LISTING and / T.
  198.  
  199. SDL's LISTING option creates a fully expanded ASCII text file of a specified 
  200. single menu or of your entire system, with all the macros you used in your 
  201. original SDL source file fully expanded.  This is useful when you begin 
  202. defining Macros in your SDL source.
  203.  
  204. SDL Macros are just like the macros used in many applications programs or 
  205. with DOS.  They allow you to specify groups of commands, even entire 
  206. menus, with a single keyword.  We'll discuss SDL Macros -- and the LISTING 
  207. option -- in part three of this tutorial series.
  208.  
  209. The / T option will perform a test compile of any single menu or of your 
  210. entire system.  SDL will compile the menus you specify, but doesn't actually 
  211. write any .CTL files as a result.  This is useful when you want to test to make 
  212. sure you've written your SDL source code correctly.  If you've made any 
  213. errors in your SDL source code, a quick test compile with SDL and the / T  
  214. option will notify you of them with an error message.
  215.  
  216. Next issue, we'll examine the syntax of TBBS's System Definition Language -- 
  217. the way to actually phrase your SDL commands so the compiler will 
  218. understand them.  Until then, practice using the SDL compiler.  Try 
  219. decompiling your menus.  Use MEDIT to examine each .CTL file and your
  220. word processor to examine the ASCII SDL source file closely.
  221.  
  222. As an added exercise, copy one of your menu .CTL files to a file with a new 
  223. name (keeping the .CTL extension), so you have a menu file you can play 
  224. with.  Use MEDIT to change something in the new menu file you've created, 
  225. then decompile the changed menu to SDL.  See if you can spot the changes by 
  226. looking at the resulting .SDL source file with your text editor.  Then, use
  227. your text editor to try and change the menu BACK the way it was.  Compile the
  228. changed menu with SDL and see how the new .CTL file looks with MEDIT.
  229.  
  230. Try these exercises a few times and you'll not only be ready for the next part,
  231. you'll be ahead of the rest of the class.  See you then.
  232.  
  233.  
  234. Part 2: Building Menus
  235. ----------------------
  236.  
  237. The TBBS System Definition Language Compiler (SDL), is easier than it looks.
  238. Simply put, it's just a different approach to designing and maintaining all of
  239. your TBBS system's menus.  Although you don't have to give up the
  240. comfortable menu-driven MEDIT program completely, you probably will -- 
  241. after you start getting the drift of SDL -- because SDL is a complete 
  242. replacement for MEDIT in every way.
  243.  
  244. In our first installment in this series, we examined the SDL compiler and 
  245. decompiler and actually put both to work.  Now, as promised, we're going to 
  246. look closely at the language itself.
  247.  
  248. The TBBS System Definition Language is written using a variety of
  249. commands.  These commands are written, usually one per line, in ASCII text
  250. files, called SDL source files.  SDL source files are written and modified
  251. using any word processor or text editor capable of creating and editing
  252. ASCII text.
  253.  
  254. Within any SDL source file, menus are defined in two basic parts: Macro
  255. Definition and Menu Definition.  We'll deal with Macros and how they work
  256. within your SDL source code in the next installment of this series.
  257.  
  258. Each menu definition in an SDL source code listing is begun with the
  259. "Menu:" Directive, followed by the name of the menu that's being defined.  A
  260. Menu Definition section is ended with the "EndMenu:" Directive.
  261. Everything between the "Menu:" and "EndMenu:" Directives defines the
  262. menu named in the "Menu:" opening Directive.
  263.  
  264. Menu titles are written between the "Title:" Directive and the "EndTitle:"
  265. directive.  Each of these Directives is typed on a line by itself and
  266. everything typed on the lines between them will appear as the title of
  267. a TBBS menu on your system when the SDL source file is compiled.
  268.  
  269. Let's take another look at the sample menu we worked with in the last
  270. installment of this series:
  271.  
  272.      Menu:1000
  273.      Billing:7
  274.      Title:
  275.      READ TBBS MESSAGES
  276.      ------------------
  277.      EndTitle:
  278.      Entry:
  279.      <R>ead Messages
  280.      A1=--X-----
  281.      Key=R Type=6 Opt Data=Bulletin Board
  282.      ...
  283.      EndMenu:
  284.  
  285. You should now be able to see that this menu definition will create a .CTL file 
  286. named MENU1000.CTL.  The menu's title, as it will appear on the compiled 
  287. TBBS system, will be "READ TBBS MESSAGES".  Another menu could be 
  288. started, in the above SDL source listing, by typing "Menu:" and a different 
  289. menu's name on a single line following the "EndMenu:" directive.
  290.  
  291. If you've done any work with MEDIT at all, it's fairly easy to see that SDL 
  292. makes the simple task of writing out a menu's title even easier.  And it gets 
  293. better.
  294.  
  295. The "Billing:" Directive follows the "Menu:" Directive in the above example.  
  296. This assigns a TBBS Billing Class to the menu that's being defined.  If you 
  297. don't specify a Billing Class in your menu, it will default to a Billing
  298. Class of 0.  For a complete discussion of TBBS Billing classes and how they
  299. work, see pages 2-14 through 2-16 in the TBBS manual.
  300.  
  301. Now you know how to start and stop, assign a billing class and create a title
  302. for each of your menus with SDL.  The next step is to set up each of your
  303. menu's options.  This is done with the "Entry:" block Directive.
  304.  
  305. The "Entry:" block is usually entered following the "EndTitle" Directive.
  306. Keywords following an "Entry:" Directive define each option that will be
  307. offered on the menu being defined.  In your SDL source file, you just write
  308. "Entry:" (without the quotes) on a line by itself to start an "Entry:" block.
  309.  
  310. In the sample menu above, there are five lines of text following the "Entry:"
  311. Directive.  These will set up one menu entry line that will be seen by a user
  312. with his or her A1 flag set to "--X-----".  It's a Type 6 menu option (Retrieve
  313. Messages) and will be activated when the user presses an "R."  In this case,
  314. theuser will be presented with messages that have been posted on the BULLETIN
  315. BOARD message base, as specified in the "OPT DATA=Bulletin Board" statement.
  316.  
  317. Be sure to examine the sample menu above carefully as you read through the 
  318. above paragraph.  Notice, for example, that only the A1 flags are defined.  The 
  319. above "Entry:" block could also have included definitions for the A2, A3 and 
  320. A4 flags.  They were omitted in the above example because only the A1 flag 
  321. was important to that menu option.  Any time you don't define a flag setting
  322. in the text following an "Entry:" Directive, SDL assumes those flags to
  323. be "--------".
  324.  
  325. Remember that each "Entry:" block is ended by the next Directive (which
  326. could be another "Entry:" Directive) or by the "EndMenu:" directive.
  327.  
  328. As I pointed out earlier, SDL works very much like MEDIT.  The main
  329. difference is that SDL lets you do everything in a text file, with your
  330. favorite word processor.  Believe it or not we've already covered
  331. everything you need to start writing SDL source files of your own.  One
  332. other Directive -- "Include:" -- is discussed when we examine Advanced SDL
  333. issues, in a later chapter.
  334.  
  335. Before we start writing SDL source code, however, we need to review some of
  336. the principals of the language's syntax.  Keep the following points in mind
  337. and your SDL source files will compile with the least number of errors
  338. possible:
  339.  
  340. STRUCTURE
  341. ---------
  342.  
  343. As we've already discussed, SDL source files are basically divided into
  344. sections of two distinct types: Macro Definition and Menu Definition.  Each
  345. of these sections is delimited by a beginning and ending Directive.  Thus,
  346. each Macro Definition begins with "Macro:MacroName" and ends with "EndMacro."
  347. Each Menu Definition begins with "Menu:MenuName" and ends with "EndMenu."
  348.  
  349. There is one exception to this rule.  When you start a new section of the same
  350. type as the previous one, you don't need to end each section with the "End:"
  351. Directive.  For example, when you're defining several menus within your
  352. SDL source file, you would start each menu with an appropriate
  353. "Menu:MenuName" Directive, but you only have to include an "EndMenu"
  354. directive on the last menu definition in the chain.  It goes something like
  355. this:
  356.  
  357.      Menu:1000
  358.              .
  359.              .  Body of Menu 1000
  360.              .
  361.      Menu:2000
  362.              .
  363.              .  Body of Menu 2000
  364.              .
  365.      Menu:3000
  366.              .
  367.              .  Body of Menu 3000
  368.              .
  369.      EndMenu:
  370.  
  371.  
  372.  
  373. DIRECTIVES
  374. ----------
  375.  
  376. As we've discovered, these are the heart and soul of any SDL source file.  
  377. When writing Directives into your SDL source file, remember that they must 
  378. always begin with the first non-blank character of a line.  Directives also 
  379. cannot contain any embedded blanks and they must always end with a colon.  
  380. They can include an argument (such as a menu name on the "Menu:" 
  381. Directive line, or the name of a macro on the "Macro:" Directive line), but 
  382. anything past the argument (or past the Directive, if there is no argument) 
  383. will be treated as a comment to the end of the line and will be ignored by SDL 
  384. when compiling your source file into menus.
  385.  
  386.  
  387. KEYWORDS
  388. --------
  389.  
  390. Keywords are used to specify arguments, which can be either Numeric, Flag 
  391. settings or Text.  Keywords are always ended with an equal sign and are 
  392. followed by the keyword's argument.  You can place keywords and arguments 
  393. several to a line if you wish, or you may give each a line of its own.  
  394. Arguments are always ended with one or more spaces or the end of a line.
  395.  
  396. In the sample source above, the keywords are "A1=" "Key=" "Type=" and 
  397. "Opt Data=".  The text following each is that keyword's argument.  They 
  398. could just as easily have been written out like this:
  399.  
  400.      A1=--X----- Key=R Type=6 Opt Data=Bulletin Board
  401.  
  402. The one EXCEPTION to the above rules is "Opt Data=".  SDL will consider 
  403. ALL the text that follows this keyword as a text parameter, to the end of the 
  404. line.  This means that the "Opt Data=" keyword must be the last entry on a 
  405. line.
  406.  
  407. UPPER AND LOWER CASE
  408. --------------------
  409.  
  410. Except for the text you enter between a "Title:" and "EndTitle:" Directive, 
  411. upper and lower case are not considered unique by SDL.  You are perfectly free 
  412. to use capitalization in your SDL code in any way that will make it easier for 
  413. you to follow.
  414.  
  415.  
  416. SPACES AND WHITE SPACE
  417. ----------------------
  418.  
  419. You may indent your SDL source files any way you wish.  Whatever makes 
  420. them easier for you to read.  The one exception to this is text between the 
  421. "Title:" and "EndTitle:" Directives.  Any text appearing between these two 
  422. Directives will display on your menu exactly as it was written in the source 
  423. file.  Everywhere else, however, SDL considers any number of spaces as a 
  424. single space, and will thus ignore the spacing you used when writing it.
  425.  
  426.  
  427. CONTROL CHARACTERS
  428. ------------------
  429.  
  430. To indicate to SDL that you want a control character to become part of a menu 
  431. when your source file is processed, it must be preceded by a "^" (without the 
  432. quotes).  Thus, "control A" would be entered in your source code file as "^A" 
  433. (without the quotes).  Of course, this means the "^" character is special in 
  434. SDL.  If you wish to use it by itself, so it will display on a menu's title,
  435. for example, you must enter it twice ("^^") in your SDL source file.  This
  436. tells SDL "I really want a "^" to appear here -- NOT a control character."  A
  437. list ofthe 32 control characters and what they are appears on page 7-4 in your
  438. TBBS manual.
  439.  
  440.  
  441. COMMENTS
  442. --------
  443.  
  444. It's always nice to add comments to your SDL source files, to remind you of
  445. why you did certain things, and to let other people who may have to use your
  446. SDL source files know what's going on.  Comments in SDL are simple:  just
  447. start a line with a semi-colon (;) and anything that follows it on the rest
  448. of the line will be ignored.  Needless to say, you can't enter comments
  449. inside of a "Title" or "Entry" text block or they will appear as part of
  450. your TBBS menu.
  451.  
  452.      ; This could be a comment in your SDL
  453.      ; file. If you need more than one line
  454.      ; just keep using semi-colons and text
  455.  
  456. Longer comments can be placed between a "Remark:" and its corresponding 
  457. "EndRemark:" Directive.  This is indeed another SDL Directive, but its sole 
  458. purpose is to allow you to include blocks of text within your SDL source files.  
  459. The "Remark:" Directive is used just like the "Title:" Directive.
  460.  
  461. Proper use of comments and "Remark:" blocks within your SDL source files 
  462. allows you to actually include documentation for your source files within the 
  463. source itself.  This can be a big help when you go back to modify your system 
  464. later.
  465.  
  466. You now have all the tools you need to create an entire TBBS system with 
  467. SDL.  Next issue, we'll look at adding POWER tools to your arsenal -- SDL's 
  468. Macros and other advanced considerations.
  469.  
  470. Until then, your assignment is to add two more options to the sample menu
  471. above.  One should be "Write Messages" and the other should be "<G>oodbye 
  472. -- Log Off System".  Make the "<W>rite Messages" option available to users 
  473. with their A1 flags set to "--X-----" and the "<G>oodbye" option available to 
  474. any caller.  Try compiling the menu (be sure to copy the source file and 
  475. SDL.COM and SDLDC.COM into a subdirectory OTHER than your current 
  476. working TBBS subdirectory).
  477.  
  478.  
  479. Part 3: Using Macros
  480. --------------------
  481.  
  482. The TBBS System Definition Language Compiler (SDL), is easier than it looks.  
  483. Simply put, it's just a different approach to designing and maintaining all of 
  484. your TBBS system's menus.  Although you don't have to give up the 
  485. comfortable menu-driven MEDIT program completely, you probably will -- 
  486. after you start getting the drift of SDL -- because SDL is a complete 
  487. replacement for MEDIT in every way.
  488.  
  489. In our first two installments we've covered all the basics you need to write 
  490. working SDL source code and create menus.  Now it's time to learn how to 
  491. drastically cut down the time and effort you spend -- with SDL Macros.
  492. Macros can actually reduce cumbersome often-repeated source code to a few 
  493. simple keystrokes.  And they're surprisingly easy to create and use.
  494.  
  495.  
  496. What are MACROs?
  497. ----------------
  498.  
  499. SDL Macros are like abbreviations, but much more compressed.  They're a 
  500. TBBS menu designer's shorthand.  If you run Lotus 1-2-3 or any one of the 
  501. popular DOS macro programs, you're probably already familiar with the 
  502. general concept of macros.
  503.  
  504. SDL Macros are created by typing a Macro Directive into your SDL source 
  505. code.  The Macro Directive names and defines each of your Macros.  You 
  506. decide how many Macros you wish to use, what their names are and what 
  507. they mean.
  508.  
  509. Just think of SDL Macros as a way to customize SDL to your own liking by 
  510. adding your own commands which can stand for any text you'd like.
  511.  
  512. Once you've defined a series of macros, the text they represent is then 
  513. included in your expanded source code listings (and in the menus that result
  514. from compiling your source code), placed wherever you've used the 
  515. matching Macro Callouts in your SDL source code (we'll take a look at Macro 
  516. Callouts in a minute).
  517.  
  518. You can, for example, define a Macro to represent the authorization flag 
  519. settings for one class of user on your system.  Then, whenever you type the 
  520. name of that Macro in your SDL code (the Macro Callout), that particular 
  521. configuration of authorization flag settings will appear in your expanded 
  522. source code listing and in the TBBS menu that results when you compile the 
  523. complete SDL source code listing.
  524.  
  525. The first step is to define the Macros you'll be using.  This is done, anywhere 
  526. within your SDL source code file, with the Macro: Directive.
  527.  
  528. The Macro: Directive works like the Menu: Directive we learned about 
  529. earlier.  In your source code, type "Macro:" followed by the name you wish to 
  530. assign to that particular Macro.
  531.  
  532. For example, to create a Macro named "Users" you would type "Macro: Users" 
  533. on one line.  Then, on the lines following the Macro name, you would type 
  534. the text that Macro will represent.  Macro names can include any 
  535. alphanumeric characters, including the special characters _ # $ and &, in any
  536. combination, up to 128 characters in length.
  537.  
  538. The standard Macro Definition structure looks something like this:
  539.  
  540.      Macro: Users
  541.              .
  542.              .  Body of Macro "Users"
  543.              .
  544.      Macro: MoreUsers
  545.              .
  546.              .  Body of Macro "MoreUsers"
  547.              .
  548.      EndMacro:
  549.  
  550. The body of your Macro is everything that appears between the "Macro:
  551. name" and the "EndMacro:" Directives.  This is the actual text or menu
  552. definition information that will appear, wherever you place the appropriately
  553. named Macro Callout in your source code, in your compiled system menus
  554. and expanded SDL source code listings.
  555.  
  556. Macro Callouts are simply an @ sign followed by the Macro's name.  To call
  557. out our sample Macro, with the name Users, you would simply type:
  558.  
  559.      @Users
  560.  
  561. anywhere in your SDL source code where you want the text you've defined
  562. with the Macro: Users Directive to appear.
  563.  
  564. Macro Callouts can be included in any SDL source code text, including Text
  565. Definition blocks.  This makes the @ character special.  SDL will think you are
  566. calling out a Macro whenever the character appears in your text unless you
  567. type two @@'s in a row instead.  This is the way you tell SDL that you want a
  568. single @ sign to be treated as text.
  569.  
  570. Ordinarily, a single space between the end of your Macro Callout and the
  571. continuation of your text is enough to tell SDL where your macro name ends, 
  572. but not always.  For example, if a Macro, named UserDrive, was defined to 
  573. replace the drive designator D:, it could be written like this:
  574.  
  575. and would be called out like this:
  576.  
  577.      @UserDrive
  578.  
  579. but, inside a string of text, you might run into a situation where you want to 
  580. use the macro like this:
  581.  
  582.      Opt Data=@UserDrive \PATH\USERS
  583.  
  584. Note the space following the @UserDrive callout above.  This is necessary, to 
  585. tell SDL that the Macro Callout has ended and the pathname, which is the 
  586. continuation of your source code text, has begun.  But, when SDL expands 
  587. this Macro, as you compile your source code, you'll get an unwanted space 
  588. between the resulting D: drive designator and the pathname, like this:
  589.  
  590.      OptData=D: \PATH\USERS
  591.  
  592. In cases like this, just type a + sign at the end of your Macro Callout to tell 
  593. SDL you've reached the end of the callout, without the extra space.  For 
  594. example:
  595.  
  596.      OptData=@UserDrive+\PATH\USERS
  597.  
  598. would properly expand to:
  599.  
  600.      OptData=D:\PATH\USERS
  601.  
  602. Ordinarily, the + sign isn't necessary at the end of Macro Callouts outside of
  603. text strings, but you can use this convention any time you wish.
  604.  
  605.  
  606. PARAMETER PASSING
  607. -----------------
  608.  
  609. If you want to reduce your keystrokes (and source code) even more, SDL's 
  610. Macro Parameter Passing can be the answer.  With Parameter Passing, you can 
  611. specify up to nine arguments within your Macro Definition (with %1, %2, %3 
  612. and so on, through %9), then actually define each of those arguments in each 
  613. Macro Callout, changing them with each Callout as you see fit.
  614.  
  615. This sounds more complex than it really is.  Actually, Parameter Passing is 
  616. just a way to make selected Macros more flexible.  For example, you COULD 
  617. create the following different Macro definitions:
  618.  
  619.      Macro: Define1
  620.      Type=34 Key=D Opt Data=C:\FILES\DNLD
  621.      Macro: Define2
  622.      Type=28 Key=F Opt Data=C:\FILES\UPLD
  623.      EndMacro:
  624.  
  625.  
  626. These two Macros would be called out with the @DEFINE1 and @DEFINE2 
  627. callouts, respectively.  This is a perfectly acceptable way to do it.  But you 
  628. could, instead, define this SINGLE Macro:
  629.  
  630.      Macro: Define
  631.      Type=%1 Key=%2 Opt Data=%3
  632.      EndMacro:
  633.  
  634. and call it out several different ways in your SDL source code.  In the above 
  635. example Macro, we've used three Parameters for the actual menu 
  636. configuration data.  The number of each Parameter tells SDL how to order the 
  637. list of variable Parameters that you'll specify when you call out the above 
  638. Macro in your SDL source code.  For example, you could call out the SAME 
  639. example Macro two different ways:
  640.  
  641.      @DEFINE(34,D,C:\FILES\DNLD)
  642.  
  643. and
  644.  
  645.      @DEFINE(28,F,C:\FILES\UPLD)
  646.  
  647.  
  648.  
  649. This would give you the same result as the two DIFFERENT Macro definitions
  650. and Macro Callouts in the preceding example.
  651.  
  652. Notice that your arguments are stated within parenthesis, in the order in 
  653. which you wish them to be placed.  The parentheses always follow the Macro 
  654. Callout, with no spaces between them and the Callout.
  655.  
  656. You can include embedded and trailing spaces in your Macro Callout 
  657. arguments.  However, you must enclose your arguments within single or 
  658. double quotes if you want to include leading spaces, commas or parenthesis as 
  659. part of a Macro parameter.
  660.  
  661. Arguments within Macro Parameters can be mixed any way you wish, as long 
  662. as there are no more than the nine total that are allowed.  You can also leave 
  663. out arguments when calling out a Macro with parameters.  When a Macro 
  664. Callout with blank parameters is expanded, the missing arguments will be 
  665. blank in your compiled menu and expanded source code listing.  This 
  666. capability can be useful for those TBBS menu options that automatically 
  667. revert to default settings when left blank.  Why type more than you have to?
  668.  
  669. EQUATE DIRECTIVES
  670. -----------------
  671.  
  672. Another quick and easy way to use Macros within your SDL code is the Equate 
  673. Directive.  The Equate Directive works like a Macro and follows all of the 
  674. rules of Macro definition, but it's defined on a single line.  Equate
  675. Directives are especially handy if you want to define a single parametric value.  For
  676. example:
  677.  
  678.      Equate: DataFiles = D:\TBBS\DATAFILE
  679.  
  680. defines exactly the same macro as:
  681.  
  682.      Macro: DataFiles
  683.      D:\TBBS\DATAFILE
  684.      EndMacro:
  685.  
  686. Equates are called out exactly the same way as you would call out any Macro.
  687. The Equate we defined in the above example could be called out like this:
  688.  
  689.      Opt Data=@DataFiles+\FILE1
  690.  
  691. This type of equate can be very useful if you move areas around on your disk
  692. drive.  You need only change the equate and recompile your menus.  All of 
  693. the menu commands which reference files will automatically begin to look in 
  694. the new area.  You avoid the need to track down and change each entry 
  695. individually!
  696.  
  697. You can use Parameter Passing or any other Macro feature within your Equate 
  698. Directives, as long as you can fit it all on a single line. 
  699.  
  700. MACRO NESTING
  701. -------------
  702.  
  703. If you want to get the most power out of your SDL macros you can also 
  704. include Macros within your Macros.  This is called Macro Call Nesting.  You 
  705. can even use Macro Callouts in other Macro definitions or as parameters 
  706. within Macro Callouts.
  707.  
  708. This ability to incorporate Macros within Macros allows you to effectively 
  709. double up on your customized "SDL shorthand" as you create new Macros.  
  710. Macros can be nested in this way up to 25 levels deep.
  711.  
  712. There are some excellent examples of Macro Nesting in your TBBS manual 
  713. (pages 7-8 and 7-9) and we'll cover this capability in depth in the final 
  714. installment of this series.  We'll take a look at some favorite SDL tricks and 
  715. tips and generally wrap up all the loose ends then, too.
  716.  
  717. Until then, take time to experiment with Macros.  Try using them in your 
  718. SDL code.  Create at least one Macro Definition that includes a Macro Callout 
  719. within it and we'll check your progress next issue.
  720.  
  721.  
  722. Part 4: Advanced Techniques 
  723. ---------------------------
  724.  
  725. We've gained a solid handle on SDL in the first three partsof this articles. In 
  726. fact, we've covered everything you need to know to create and maintain all of 
  727. your TBBS menus with SDL.  Now we're going take a look at some of SDL's 
  728. more advanced capabilities.
  729.  
  730.  
  731. Macro Call Nesting
  732. ------------------
  733.  
  734. Last chapter, we looked briefly at Macro call nesting. Simply put, Macro call 
  735. nesting is the ability to include SDL Macros within other SDL Macros.  This 
  736. capability can also be used to use Macros as parameters to other Macros.  This 
  737. is a potentially cumulative capability.  Macros containing other Macros can be 
  738. nested inside still other Macros, and so on, up to 25 levels deep.
  739.  
  740. For example, let's create a couple of macros:
  741.  
  742.     Macro: Action
  743.     Type=%1 Key=%2 OptData=%3
  744.     Macro: Download
  745.     46
  746.     Macro: Path
  747.     C:\TBBS\DOWNLOAD
  748.     EndMacro:
  749.  
  750. Now let's call out the above Macros, using some as Nested Macro Callouts:
  751.  
  752.      @Action(@Download,N,@Path+\FILES /NTL)
  753.  
  754. ... for example, would expand to:
  755.  
  756.      Type=46 Key=N OptData=C:\TBBS\DOWNLOAD\FILES /NTL
  757.  
  758. In the above example, the "@Download" and "@Path" Macro callouts, inside
  759. the parenthesis, are examples of Nested Macro Callouts being used as
  760. parameters to another Macro.
  761.  
  762. Although Macros are traditionally used by most computer software packages
  763. to reduce keystrokes, you might have noticed that the Macros in the above
  764. example are actually longer, in most cases, than the character strings they
  765. invoked.  Although the Macros might be longer, in the above example
  766. they're still useful to help the TBBS system designer organize the various
  767. disk drives, subdirectories and menu option types that might be used in a
  768. given TBBS system.  It's much easier to remember "@Download," for 
  769. example, than it is to remember that a Type 46 menu command invokes a 
  770. Pseudo Download Function.
  771.  
  772. The Include: Directive
  773. ----------------------
  774.  
  775. The Include: Directive is yet another aid to organizing your SDL code.  You 
  776. may have noticed by now that all the SDL code for a complete TBBS system 
  777. can be incorporated into a single text file.  With a large TBBS system, a single 
  778. SDL source code file can get bulky.  The Include: Directive, lets you effectively 
  779. break up potentially source code files into multiple files, but still call them up 
  780. for compilation as if they were all part of a single source code file.
  781.  
  782. It's kind of like eating a large meal one bite at a time.  That's always easier 
  783. than trying to dump a whole plate down your throat all at once.
  784.  
  785. To use the Include: Directive, simply type "Include:" followed by the full DOS 
  786. drive designator, path and, finally the name of the file that you wish to 
  787. include in your source code.  An Include: Directive to insert a source file 
  788. named MAILMENU.SDL residing in your \MENUS subdirectory might look 
  789. like this in your main SDL source code:
  790.  
  791.      Include: C:\MENUS\MAILMENU.SDL
  792.  
  793. Include: Directive files cannot have Include: Directives in them.  Only the 
  794. original SDL file can have them.  But, you can use Include: Directives inside 
  795. Macros in your original file.  Just remember that Include: Directives in 
  796. Macros won't be executed until those Macros are expanded.
  797.  
  798. The Include: directive is especially useful when you make libraries of macro 
  799. commands.  You can then invoke these standard macros by using the Include: 
  800. directive in any SDL source file you create.
  801.  
  802.  
  803. Conditional Compilation
  804. -----------------------
  805.  
  806. Early in this series, we examined SDL's array of compilation options.  One 
  807. advanced SDL compile capability we haven't yet examined is the Conditional 
  808. compilation.
  809.  
  810. SDL's conditional compilation capabilities allow you to create and maintain 
  811. several different systems within a single source code file or series of source 
  812. code files.  This capability is especially useful, for example, to computer 
  813. consultants who might need to manage several different TBBS systems for a 
  814. number of clients.  Consultants who sell turnkey TBBS systems to their 
  815. clients can use conditional compilation to create a single "basic" source code 
  816. listing which is capable of creating a multitude of entirely different TBBS 
  817. systems, depending on the commands given when he or she compiles each 
  818. system.
  819.  
  820. This capability also allows you to construct complex macros which condition 
  821. their actions on how many or what types of input parameters they are called
  822. with.  You could use this capability to offer an option to <S>can Messages in 
  823. some of your system's message bases, but not in others.
  824.  
  825. The syntax is straightforward.  A Conditional Block is entered in an SDL 
  826. source code listing, opening with either an If: or an IfNot: statement and 
  827. closed by an Endif: statement.  All lines of code appearing between the 
  828. conditional opening and closing statement are either enacted upon or 
  829. ignored, depending upon whether they match the opening statement.
  830.  
  831. A conditional block looks like this:
  832.  
  833.      If:     string1=string2
  834.              lines of code which will be
  835.              compiled if they match the
  836.              conditional string)
  837.      Endif:
  838.  
  839. Or...
  840.  
  841.      IfNot:   string1=string2
  842.              .       lines of code which will NOT
  843.              .       be compiled if they match the
  844.              .       conditional string)
  845.      Endif:
  846.  
  847.  
  848.  
  849. The If: and IfNot: blocks you've entered into your source code are acted upon 
  850. when you compile your SDL source code into a TBBS system menu or series 
  851. of menus.  Since If: and IfNot: blocks entered into Macros will not take effect 
  852. until the Macro is expanded, you can perform two or more tasks with the 
  853. same Macro.  An example is:
  854.  
  855.      Macro: Action
  856.      Key=%1 Type=%2
  857.      IfNot: %3=
  858.      Opt Data=%3
  859.      Endif:
  860.      EndMacro:
  861.  
  862. Note that the second string is absent in the IfNot: statement.  This makes the 
  863. IfNot: test for the presence or absence of the third parameter in the macro.  If 
  864. %3 expands to any text at all, it will fail to match an empty string (nothing) 
  865. and generate the Opt Data portion of the command.  For example:
  866.  
  867.      @ACTION(K,11)
  868.  
  869. Would expand to:
  870.  
  871.      Key=K Type=11
  872.  
  873. However, if a third parameter is added to the callout the expansion changes.  
  874. For example:
  875.  
  876.      @ACTION(E,5,EMAIL)
  877.  
  878. Would expand to:
  879.  
  880.      Key=E Type=5 Opt Data=EMAIL
  881.  
  882.  
  883. ANSI and Graphics in TBBS Menus
  884. -------------------------------
  885.  
  886. By far, the one SDL capability most often asked about is the ability to include 
  887. ANSI and graphics in TBBS menus.  This is easier than it at first appears.
  888.  
  889. It is possible to enter graphics display strings in your SDL source code because 
  890. SDL allows direct entry of control characters and ANSI characters in a source 
  891. file.  This makes the task of designing graphics screens for your TBBS menus 
  892. a fairly simple one.
  893.  
  894. You simply insert the proper ANSI or graphics characters in your SDL source 
  895. code in the menu's Title: or Entry: Directive text block.  These can be 
  896. commands to draw something as simple as a box or as complex as a screen 
  897. drawing of a landscape.  Your only real limit is the number of characters that 
  898. can be included in an Entry: Directive (1000 characters).  You can get around 
  899. this limit by using several Entry: directives with a portion of the text on each 
  900. one.   There are some good examples of such SDL files on the support board 
  901. for your reference.
  902.  
  903. In either case, just include all of your system's menu commands in whatever 
  904. ANSI or graphics screen drawing you devise, so they display as part of your 
  905. drawing.  If you were drawing a simple box, a list of that particular menu's 
  906. available commands should be displayed inside the box.  On a landscape, you 
  907. could run the list of commands across the bottom or top of the screen, or 
  908. maybe have them appear on a tree trunk, if you're so inclined.
  909.  
  910. Next, set up all of the menu's appropriate Entry: Directives, but don't include 
  911. a text line for each of the commands that are available on that menu.  Skip 
  912. the text line for each Entry: Directive, setting up each of the menu's available 
  913. commands without them.  Then, your menu will display the graphics menu 
  914. you've drawn with ANSI codes and NOT the usual ASCII text lines you 
  915. insert in each Entry:Directive, but each of the menu's defined keys will still 
  916. work.
  917.  
  918. But, how exactly do you draw with ANSI codes?  This is essentially an art and 
  919. precise instruction is far beyond the scope of an article of this size.  The ANSI 
  920. codes themselves are listed on the last page of the Overview section of your 
  921. TBBS manual. If you're patient, it's best to enter ANSI graphics codes directly 
  922. into your SDL source code.  A working knowledge of ANSI graphics codes 
  923. will allow you to create a series of SDL Macros that draw specific lines and 
  924. boxes that you might want to use regularly and these can then do a lot of the 
  925. repetitive work for you.  Examples of such macros are also available on the 
  926. TBBS support BBS for downloading.
  927.  
  928. But, there is another way...
  929.  
  930. Many TBBS system designers use a popular ANSI graphics drawing program, 
  931. such as THEDRAW (available on the eSoft Support BBS).  With THEDRAW, 
  932. you can actually DRAW your graphics on-screen, without having to know 
  933. the actual ANSI codes that are being used.  The program then allows you to 
  934. SAVE your drawings to an ASCII text file that will contain all the ANSI 
  935. graphics codes that were used to draw the screen you've created.
  936.  
  937. Once you've drawn your menu screen with a program like THEDRAW, then 
  938. saved it to disk, you can pull the resulting ANSI code file into your SDL 
  939. source code with almost any word processor, inserting it right where you 
  940. want it to display.  This method sometimes requires minor additional editing, 
  941. so an understanding of how ANSI works is still useful, but it's usually not 
  942. necessary.  The only editing you will normally need is to break the ASCII file 
  943. into sections which are smaller than 1000 characters each and adding the 
  944. Entry: directive in front of each one.
  945.  
  946. And that's literally everything you need to know to consider yourself an 
  947. experienced, capable SDL programmer.  Like any language, you'll find 
  948. yourself learning continually as you go, adding to your bag of tricks by trial 
  949. and error. 
  950.  
  951.